import java.io.*;
import java.util.Scanner;

public class Demo2 {
    public static void main(String[] args) {
        // 创建 Scanner 对象，用于获取用户输入
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入源文件路径
        System.out.print("请输入要复制的文件(绝对路径 OR 相对路径): ");
        String sourcePath = scanner.next(); // 获取用户输入的源文件路径
        File sourceFile = new File(sourcePath); // 创建 File 对象表示源文件

        // 检查源文件是否存在
        if (!sourceFile.exists()) {
            System.out.println("文件不存在，请确认路径是否正确");
            return; // 如果文件不存在，停止执行
        }

        // 检查源文件是否是一个普通文件
        if (!sourceFile.isFile()) {
            System.out.println("文件件不是普通文件，请确认路径是否正确");
            return; // 如果不是普通文件，停止执行
        }

        // 提示用户输入目标文件路径
        System.out.print("请输入要复制到的目标路径(绝对路径 OR 相对路径): ");
        String destPath = scanner.next(); // 获取用户输入的目标路径
        File destFile = new File(destPath); // 创建 File 对象表示目标文件

        // 检查目标路径是否是一个目录
        if (destFile.isDirectory()) {
            System.out.println("目标路径已经存在，并且是一个目录，请确认路径是否正确");
            return; // 如果目标路径是目录，停止执行
        }

        // 检查目标路径是否已经是一个文件
        if (destFile.isFile()) {
            // 如果目标文件存在，提示用户是否要覆盖
            System.out.println("目录路径已经存在，是否要进行覆盖？y/n");
            String choice = scanner.next(); // 获取用户输入的选择
            if ("n".equals(choice.toLowerCase())) { // 如果用户选择不覆盖
                System.out.println("停止复制");
                return; // 停止执行
            }
        }

        // 使用 try-with-resources 自动关闭资源
        try (InputStream inputStream = new FileInputStream(sourceFile); // 创建输入流读取源文件
             OutputStream outputStream = new FileOutputStream(destFile)) { // 创建输出流写入目标文件

            byte[] buffer = new byte[1024]; // 创建一个缓冲区，大小为1024字节

            int length = 0;

            // 循环读取源文件内容并写入到目标文件
            while (true) {
                length = inputStream.read(buffer); // 从源文件读取数据到缓冲区
                if (length == -1) { // 如果读取结束（即文件末尾）
                    break; // 跳出循环
                }
                outputStream.write(buffer, 0, length); // 将缓冲区内容写入目标文件
            }

            // 刷新输出流，确保所有数据写入文件
            outputStream.flush();
            System.out.println("文件复制完成"); // 提示文件复制完成

        } catch (FileNotFoundException e) { // 捕获文件未找到异常
            throw new RuntimeException(e);
        } catch (IOException e) { // 捕获IO异常
            throw new RuntimeException(e);
        }

    }
}
